/*
 * ThreadatenderConsola.c
 *
 *  Created on: 27/11/2011
 *      Author: ${Petris-Normandia}
 */




#include "DiscPlanning.h"

void sigchld_handler(int signal){
	while (waitpid(-1,0,WNOHANG));
}


void atenderConsola(){

	int DescriptorServer;
	char* datosCliente;
	T_MENSAJE* mensajeSaliente;
	T_MENSAJE* mensajeEntrante;
	tregCHS regfis;
	void* buffer;
	tregCHS vectorTrace[5];
	int8_t i=0;
	int8_t j;
	pid_t processID;
	DescriptorServer= Abre_Socket_Unix(parametros->pathSocketUnix);
 	if ((processID = fork()) == -1)
			{
			perror("Error en llamada a fork\n");
			exit(1);
			}
			else if (processID == 0) //Proceso hijo
			{

					execl(pathConsola,"Consola-PDD",NULL);

			}
			else{
	//Proceso padre
	descriptorSocketUnix=Acepta_Conexion_Cliente (DescriptorServer);
	while(1){
	uint16_t len;

	datosCliente=(char*)malloc(MAX_SIZE_MSG);
	if(leer_Socket_Unix(descriptorSocketUnix,datosCliente,INFO_MSG)<=0)
	break;
	memcpy(&len,datosCliente+1,2);
	leer_Socket_Unix(descriptorSocketUnix,(datosCliente+3),len);
	mensajeEntrante=decodificarMensaje(datosCliente);
	free(datosCliente);

	switch(mensajeEntrante->tipo){

			case TIPO_INFO:

				buffer = malloc(4);
				memcpy(buffer,&posactual->cylinder,2);
				memcpy(buffer+2,&posactual->sector,2);
				mensajeSaliente=generarMensaje(TIPO_INFO,4,buffer);
				enviarPorSocketUnix(descriptorSocketUnix,mensajeSaliente);
				eliminarMensaje(mensajeSaliente);
				break;

			case TIPO_WRITESECTOR:
				regfis.socket=-1;
				tratarmsj(mensajeEntrante, &regfis);
				traducirPedido(&regfis);
				if (strcmp(parametros->algoritmo, "fscan") == 0) {
					meterPila(&pilaFscan,regfis);
					fScan(&pilaFscan);
				} else
					cLook(regfis);
				break;

			case TIPO_CONSOLE:


				tratarmsj(mensajeEntrante, &regfis);
				traducirPedido(&regfis);
				vectorTrace[i]=regfis;
				i++;
				if(i==regfis.ID_pedido){
					if (strcmp(parametros->algoritmo, "fscan") == 0) {
						for(j=0;j<i;j++){
						meterPila(&pilaFscan,vectorTrace[j]);}
						fScan(&pilaFscan);
						} else{
						for(j=0;j<i;j++)
						cLook(vectorTrace[j]);}
					i=0;
				}

				break;

			}
	}
	msync(princArchivo,Size_Disk,MS_SYNC);
	munmap(princArchivo,Size_Disk);
	closeDisc();
	pthread_kill(t_id1,SIGKILL);
	pthread_kill(t_id2,SIGKILL);
	printf("Cerrando PDD...\n");
	return;



}
}

